/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.cip.esymons.colegiatura.bc;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import oracle.toplink.essentials.config.HintValues;
import oracle.toplink.essentials.config.TopLinkQueryHints;
import org.cip.esymons.colegiatura.be.Preinscripcion;
import org.cip.esymons.general.be.DireccionPersona;
import org.cip.esymons.general.be.PersonaNatural;
import org.cip.esymons.general.be.TelefonoSolicitante;

/**
 *
 * @author ADMINISTRADOR
 */
@Stateless
public class PreinscripcionFacade implements PreinscripcionFacadeLocal {
    @PersistenceContext
    private EntityManager em;

    public void create(Preinscripcion preinscripcion) {
        em.persist(preinscripcion);
        em.createNativeQuery("commit;").executeUpdate();
        em.flush();
        
    }

    public void edit(Preinscripcion preinscripcion) {
        em.merge(preinscripcion);
    }

    public void remove(Preinscripcion preinscripcion) {
        Preinscripcion aux = em.merge(preinscripcion);
        em.remove(aux);
    }

    public Preinscripcion find(Object id) {
        try{
        return em.find(Preinscripcion.class, id);
        }catch(Exception ex){
            return null;
        }
    }

    public List<Preinscripcion> findAll() {
        return em.createQuery("select object(o) from Preinscripcion as o").getResultList();
    }

    public List<Preinscripcion> listaPorFechasOrdenDNI(Date fechaIni, Date fechaFin) {
        
        return em.createQuery("select object(o) from Preinscripcion as o where o.perCodigo.perTipo = 2 " +
                "and o.prefechaInscripcion between ?1 and ?2 order by o.perCodigo.perNroDNI").setParameter(1, fechaIni).setParameter(2, fechaFin).getResultList();
    }

    public List<Preinscripcion> listaPorFechasOrdenApellidos(Date fechaIni, Date fechaFin) {
     
        return em.createQuery("select object(o) from Preinscripcion as o where o.perCodigo.perTipo = 2 " +
                "and o.prefechaInscripcion between ?1 and ?2 order by o.perCodigo.perapellidoPaterno").setParameter(1, fechaIni).setParameter(2, fechaFin).getResultList();
    }

    public List<Preinscripcion> listaPorFechasOrdenFechaIncrip(Date fechaIni, Date fechaFin) {
        
        return em.createQuery("select object(o) from Preinscripcion as o where o.perCodigo.perTipo = 2 " +
                "and o.prefechaInscripcion between ?1 and ?2 order by o.prefechaInscripcion").setParameter(1, fechaIni).setParameter(2, fechaFin).getResultList();
    }

    public List<Preinscripcion> listaPorFechasOrdenCapitulo(Date fechaIni, Date fechaFin) {
        
        return em.createQuery("select object(o) from Preinscripcion as o where o.perCodigo.perTipo = 2 " +
                "and o.prefechaInscripcion between ?1 and ?2 order by o.ecaCodigo.capCodigo.capDescripcion").setParameter(1, fechaIni).setParameter(2, fechaFin).getResultList();
    }

    public List<Preinscripcion> listaPorFechasOrdenEspecialidad(Date fechaIni, Date fechaFin) {
       
        return em.createQuery("select object(o) from Preinscripcion as o where o.perCodigo.perTipo = 2 " +
                "and o.prefechaInscripcion between ?1 and ?2 order by o.fopCodigo.espCodigo.espDescripcion").setParameter(1, fechaIni).setParameter(2, fechaFin).getResultList();
    }

    public Preinscripcion buscarPreInscripcion(Long codigo) {
        try{
        return (Preinscripcion) em.createQuery("select object(o) from Preinscripcion as o where o.perCodigo.solCodigo=?1").setParameter(1, codigo).getSingleResult();
//            Query q = em.createQuery("select object(o) from Preinscripcion as o where o.perCodigo.solCodigo=?1").setParameter(1, codigo);
//            return (Preinscripcion) q.setHint(TopLinkQueryHints.REFRESH, HintValues.TRUE).getSingleResult();
        }catch(Exception ex){
            return null;
        }
    }

    public DireccionPersona findDireccion(Object id) {
        return em.find(DireccionPersona.class, id);
    }

    public List<Preinscripcion> listaPorFechasYConDireccion(Date fechaIni,Date fechaFin) {

        DireccionPersona direccion;
        TelefonoSolicitante telefono;
        TelefonoSolicitante celular;
        List<DireccionPersona> listaDirecciones;       
        List<TelefonoSolicitante> listaTelefono;        
        List<TelefonoSolicitante> listaCelular;
        List<Preinscripcion> listaPreInscripcion;

        listaPreInscripcion = em.createQuery("select object(o) from Preinscripcion as o where o.perCodigo.perTipo = 2 and o.prefechaInscripcion between ?1 and ?2 order by o.perCodigo.perapellidoPaterno").setParameter(1, fechaIni).setParameter(2, fechaFin).getResultList();
        
        for(int i=0;i<listaPreInscripcion.size();i++){

            Long codigoPre = null;
            codigoPre = listaPreInscripcion.get(i).getPerCodigo().getSolCodigo();
            

            listaDirecciones = em.createQuery("select dir from DireccionPersona as dir where dir.solCodigo.solCodigo=?1").setParameter(1, codigoPre).getResultList();
            listaTelefono = em.createQuery("select t from TelefonoSolicitante as t where t.tsotipoTelefono = 'fijo' and t.solCodigo.solCodigo=?1").setParameter(1, codigoPre).getResultList();
            listaCelular = em.createQuery("select t from TelefonoSolicitante as t where t.tsotipoTelefono = 'celular' and t.solCodigo.solCodigo=?1").setParameter(1, codigoPre).getResultList();
            
       
            direccion =  new DireccionPersona();
            telefono = new TelefonoSolicitante();
            celular = new TelefonoSolicitante();           

            if(listaDirecciones.size()>0) direccion = listaDirecciones.get(0);
            if(listaTelefono.size()>0) telefono = listaTelefono.get(0);
            if(listaCelular.size()>0) celular = listaCelular.get(0);

            if (direccion != null) listaPreInscripcion.get(i).setDireccion(direccion);
            if (telefono != null) listaPreInscripcion.get(i).setTelefono(telefono);
            if (celular != null) listaPreInscripcion.get(i).setCelular(celular);          
                
            }       

        return listaPreInscripcion;
    }

    public List<PersonaNatural> buscarPreinscritos(String dni, String nombres, String apePaterno, String apeMaterno){

        try {

            List<PersonaNatural> listaPreinscritos;            

            if((dni !=null && !dni.isEmpty()) || (apePaterno !=null && !apePaterno.isEmpty()) || (apeMaterno != null && !apeMaterno.isEmpty()) || (nombres != null && !nombres.isEmpty())){

                listaPreinscritos = new ArrayList<PersonaNatural>();

                String query = "Select p from PersonaNatural p ";
                query = query + " where p.perTipo = 2 ";

                if(dni !=null && !dni.isEmpty()){
                    query = query + "and p.perNroDNI = ?1";
                    listaPreinscritos = em.createQuery(query)
                        .setParameter(1, dni).getResultList();
                }else{
                    if((apePaterno !=null && !apePaterno.isEmpty()) && (apeMaterno !=null && !apeMaterno.isEmpty()) && (nombres !=null && !nombres.isEmpty())){
                        query = query + "and p.perapellidoPaterno like '"+apePaterno+
                                "%' and p.perapellidoMaterno like '"+apeMaterno+
                                "%' and p.perNombres like '"+nombres+"%' ";
                        listaPreinscritos = em.createQuery(query).getResultList();
                    }else{
                         if((apePaterno !=null && !apePaterno.isEmpty()) && (apeMaterno !=null && !apeMaterno.isEmpty())){
                                query = query + "and p.perapellidoPaterno like '"+apePaterno+
                                "%' and p.perapellidoMaterno like '"+apeMaterno+"%' ";
                                listaPreinscritos = em.createQuery(query).getResultList();
                         }else{
                             if(apePaterno !=null && !apePaterno.isEmpty()){
                                query = query + "and p.perapellidoPaterno like '"+apePaterno+"%' ";
                                listaPreinscritos = em.createQuery(query).getResultList();
                            }else{
                                return new ArrayList();
                            }
                      }
                    }
                }
                return listaPreinscritos;
                
            } else {
                return new ArrayList();
            }
         } catch (Exception e) {
             return new ArrayList();
        }        
    }

}
